package com.ruoyi.web.controller.tool.designpattern.behavioralPatterns.interpreter;

/**
 * 解释器模式
 *
 * @author Hack2003
 * @date 2024/3/21 18:10
 **/
// 抽象表达式
abstract class Expression {
    public abstract int interpret(Context context);
}

// 终结符表达式 - 数字
class NumberExpression extends Expression {
    private int number;

    public NumberExpression(int number) {
        this.number = number;
    }

    @Override
    public int interpret(Context context) {
        return number;
    }
}

// 非终结符表达式 - 加法
class AddExpression extends Expression {
    private Expression left, right;

    public AddExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context) + right.interpret(context);
    }
}

// 上下文环境（这里可以为空，因为示例简单，无需额外信息）
class Context {}

/**
 * 它提供了一种评估语言语法或表达式的方式。
 * 这种模式定义了一个表达式接口，该接口解释一个特定的上下文。
 * 在实际应用中，解释器模式常用于实现简单的、
 * 面向特定领域的小型语言或者表达式的解析与执行。
 */
public class Test {
    public static void main(String[] args) {
        Expression expression = new AddExpression(
                new NumberExpression(5),
                new NumberExpression(10)
        );

        Context context = new Context();
        int result = expression.interpret(context);  // 结果应该是 15
        System.out.println("Interpreted result: " + result);
    }
}
